#include <iostream>
#include <memory>

// 定义一个简单的类
class MyClass {
public:
    MyClass() { std::cout << "MyClass constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
    void doSomething() { std::cout << "Doing something..." << std::endl; }
};

// 普通指针示例
void useRawPointer() {
    // 使用 new 分配内存
    MyClass *rawPtr = new MyClass();
    rawPtr->doSomething();
    // 手动释放内存
    delete rawPtr;

    // 可能出现的问题：忘记释放内存
    // MyClass* anotherRawPtr = new MyClass();
    // anotherRawPtr->doSomething();
    // 没有调用 delete anotherRawPtr; 会导致内存泄漏
}

// 智能指针示例
void useSmartPointer() {
    // 使用 std::unique_ptr
    std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>();
    uniquePtr->doSomething();
    // 当 uniquePtr 离开作用域时，会自动释放内存

    // 使用 std::shared_ptr
    std::shared_ptr<MyClass> sharedPtr1 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1;
    std::cout << "Shared pointer use count: " << sharedPtr1.use_count() << std::endl;
    // 当所有指向该对象的 shared_ptr 都离开作用域时，会自动释放内存

    // 使用 std::weak_ptr 解决循环引用问题
    // 这里简单演示其基本用法，不涉及循环引用场景
    std::shared_ptr<MyClass> sharedPtr3 = std::make_shared<MyClass>();
    std::weak_ptr<MyClass> weakPtr = sharedPtr3;
    if (auto lockedPtr = weakPtr.lock()) {
        lockedPtr->doSomething();
    }
}

int main() {
    std::cout << "Using raw pointer:" << std::endl;
    useRawPointer();

    std::cout << "\nUsing smart pointer:" << std::endl;
    useSmartPointer();

    return 0;
}
